//
//  RDeliveryPullConfigTask.h
//  RDelivery
//
//  Created by selmerzhang on 2021/9/8.
//  Copyright © 2021 Tencent. All rights reserved.
//

#ifndef RDeliveryPullConfigTask_h
#define RDeliveryPullConfigTask_h

#import "RDConfigServerJsonModel.h"
#import "RDeliverySDKSettings.h"

@class RDeliveryPullConfigTask;

/// 拉取配置回包的block
/// @param responseObject 回包数据
/// @param task 请求task，带回一些请求信息用于上报/异常情况处理
/// @param error 错误信息
typedef void(^RDPullConfigCompletedBlock)(RDConfigServerPullResponse * _Nullable responseObject,
                                         RDeliveryPullConfigTask * _Nullable task,
                                         NSError * _Nullable error);

//请求的来源，通过哪种方式发起请求
typedef NS_ENUM(NSUInteger, RDGetConfigRequestSource) {
    RDGetConfigRequestSourceStartup = 0,  //启动时请求
    RDGetConfigRequestSourceTimer = 1,    //定时请求
    RDGetConfigRequestSourceNetOn = 2,    //断网重连
    RDGetConfigRequestSourceForeground = 3,  //后台进前台
    RDGetConfigRequestSourceUserAction = 4,  //用户主动调用
};

NS_ASSUME_NONNULL_BEGIN

//拉取配置请求的task，记录请求的信息，在请求队列轮到后进行组包发送
//同时记录一些其他信息，用于上报/打日志
@interface RDeliveryPullConfigTask : NSObject

//拉取类型
@property(nonatomic, assign) RDConfigServerPullType pullType;
//拉取的key
@property(nonatomic, copy) NSArray<NSString *> *keys;
//拉取的场景id
@property(nonatomic, copy) NSArray<NSNumber *> *sceneIds;
//拉取配置的回调
@property(nonatomic, copy) RDPullConfigCompletedBlock getConfigHandler;
// 请求的 json body
@property(nonatomic, copy) NSString *httpBody;
//请求真正组包发送时的guid
@property(nonatomic, copy) NSString *requestGuid;
//请求真正组包发送时的环境类型
@property(nonatomic, copy) NSString *requestEnvId;
//请求真正组包发送时的context
@property(nonatomic, copy) NSString *requestContext;
//请求的id，用生成请求时的时间戳表示
@property(nonatomic, copy) NSString *requestId;
//请求的来源，通过哪种方式发起请求
@property(nonatomic, assign) RDGetConfigRequestSource source;
//合并请求的发起时间戳
@property (nonatomic, assign) NSTimeInterval batchRequestStartTime;
//请求回包是否成功
@property(nonatomic, copy) NSString *reqResult;
//回包解码是否成功
@property(nonatomic, copy) NSString *decodeResult;
//发起请求到实际发送请求的耗时
@property(nonatomic, assign) NSTimeInterval queueTime;
//发出网络请求到收到网络回包的耗时
@property(nonatomic, assign) NSTimeInterval netTime;
//收到网络回包到解码结束的耗时
@property(nonatomic, assign) NSTimeInterval decodeTime;
//发起请求开始时间
@property(nonatomic, assign) NSTimeInterval startTime;
//请求真正调度发出时间
@property(nonatomic, assign) NSTimeInterval netStartTime;
//解码开始时间
@property(nonatomic, assign) NSTimeInterval decodeStartTime;
//请求的包体大小
@property(nonatomic, assign) UInt64 reqSize;
//拉取内容类型，开关或配置
@property(nonatomic, assign) RDPullConfigType pullConfigType;
//拉取目标类型，项目或产品
@property(nonatomic, assign) RDConfigServerPullTarget pullTarget;


#pragma mark - 分包相关
//是否是分包的请求，如果是，则除了context和时间戳之外的请求参数需要和第一次请求保持一致
@property(nonatomic, assign) BOOL hasNext;
//分包请求带上后台返回的context
@property(nonatomic, copy) NSString *separateContext;
//第一次请求的真正发起时间，用于分包请求的计算超时时间
@property(nonatomic, assign) NSTimeInterval firstRequestSendTime;
//第一次的请求体
@property(nonatomic, strong) RDConfigServerPullRequest *firstRequest;
//缓存已经拉到的分包回包
@property(nonatomic, strong) NSMutableArray<RDConfigServerPullResponse *> *responseArray;

#pragma mark - 解密相关
/// 本次请求生成的随机对称秘钥
@property(nonatomic, copy) NSString *AESEncryptKey;

#pragma mark - 回包信息
//如果回包code!=0，会不走配置存储流程，但某些重要回包信息（如控制SDK拉取间隔）需要存储，所以放到task里面带上
//解密后的response
@property(nonatomic, strong) RDConfigServerPullResponse *response;

@end

NS_ASSUME_NONNULL_END

#endif /* RDeliveryPullConfigTask_h */
